Escopos dentro do JavaScript:


1: Escopo Global : O que for declarado neste escopo estará acessível a qualquer item do código.
Ex:
			<script>
				var global;
			</script>
		
2: Escopo de Função : A variável é definida dentro de uma função.
Caso ela seja declarada com VAR terá seu escopo promovido a global.
Se for declarada com LET terá seu escopo de função preservado ( não estará visível pelo global).
O que for declarado neste escopo estará acessível a qualquer item do código.
Ex:
			<script>
				function x(){
					var global;
					let varfunction;
				}
			}
			</script>
		
3-Escopo de bloco: Ocorre quando a variável é definida dentro de um bloco( entre {} ),
Temos aqui 2 possibilidades :
3.1-Quando a declaração da variável é feito dentro de um bloco que esta dentro de uma função.
   Neste caso,se a variável for declarada como VAR, terá seu escopo promovido para escopo de função.
   Mas se a variável for declarada como LET, terá seu escopo mantido no escopo apenas do bloco.
			<script>
				function x(){
					if(true){
						var funcao;
						let varbloco;
					}
				}
			}
			</script>
		
3.2-Quando a declaração da variável é feito dentro de um bloco que esta dentro do escopo global.
   Neste caso,se a variável for declarada como VAR, terá seu escopo promovido para escopo global.
   Mas se a variável for declarada como LET, terá seu escopo mantido no escopo apenas do bloco.
			<script>
				if(true){
					var funcao;
					let varbloco;
				}
			}
			</script>
		

Hoisting:

Sempre que declaramos uma variavel com o comando VAR este comportamento ocorrerá quando uma variável, definida dentro de escopo, é , por um detalhe do JavaScript,
promovida em seu escopo elevado para um nível imediatamente superior.

Diferença entre o let e o var:

O let foi inventado para evitar o hoisting feito pelo javascript em certas ocasiões como ao declararmos uma variável com var dentro de uma função.
Portanto o comando LET não possibilita o hoisting de variáveis.